package com.gec.service.workflow;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.activiti.engine.history.HistoricIdentityLink;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
//发布Deployment
//流程定义ProcessDefinition--（类)流程图设计图纸
//流程实例ProcessInstance--(对象)每个人发起一个申请，就要按上面图纸创建流程实例，张三报销要产生一个流程实例，王武要报销要产生另外一个实例，王武第二个报销，也要新建一个流程实例
//执行对象Execution--（不同的路径）流程实例里面的路径，区分不同的路径不同的进度
//任务Task--任务

//备注信息Comment--任务每运行一次可能会有批示信息
//人员 

public interface WorkflowService {

	/*** 流程设计图相关 ****/
	// 发布流程图(上传的文件,名字-不是特别重要,自己起)
	void saveNewDeploye(File file, String name);

	void saveNewDeploye(InputStream input, String name);

	// 查找流程发布列表
	List<Deployment> findDeploymentList();

	// 获取当前任务的图形坐标位置
	List<Map<String, Object>> findCoordingByBizkey(String processDefineKey, String bizkey);

	// 查找某个任务的输出连线的名称（用于动态变化按钮的名称)
	List<String> findOutComeListByTaskId(String taskId);

	// 查找流程图信息用于显示图片（根据发布ID和图片名称）
	InputStream findImageInputStream(String deploymentId, String imageName);

	// 根据流程key值和绑定的业务key值，查找流程图，用于显示流程图
	InputStream findImageInputStreamByBizkey(String processDefineKey, String bizkey);

	/*** 获取流程定义ProcessDefinition相关 ***/
	// 查找流程定义列表
	List<ProcessDefinition> findProcessDefinitionList();

	// 根据任务ID，获取任务对象，使用任务对象获取流程定义ID，查询流程定义对象
	ProcessDefinition findProcessDefinitionByTaskId(String taskId);

	// 删除流程定义信息
	void deleteProcessDefinitionByDeploymentId(String deploymentId);

	/*** 流程实例ProcessInstance相关 ***/
	// 启动一个工作流实例(发起一个按某个图纸规定的流程,每个申请单就要发起一个流程实例)
	ProcessInstance saveStartProcess(String processkey, String bizkey, Map<String, Object> variables);

	// 根据业务key找到流程实例
	ProcessInstance findProcessInstanceByBizkey(String processDefineKey, String bizkey);

	/*** 任务Task相关 ***/
	// 根据操作人查找任务列表(必须由你处理)
	List<Task> findTaskListByName(String userkey);// userkey格式由你定 baoxiao_1_张三
	// 查找组任务列表，根据流程定义的key值和操作人查找任务列表(用流程定义key值分辨是哪种流程)

	List<Task> findTaskListByName(String processkey, String userkey);// userkey格式由你定 1_张三
	// 查找组任务列表(一组人有资格处理)，根据流程定义的key值和操作人查找任务列表(用流程定义key值分辨是哪种流程)

	List<Task> findGroupTaskListByName(String processkey, String userkey);

	// 根据任务id查找任务的formkey
	String findTaskFormKeyByTaskId(String taskId);

	// 根据任务id查找绑定业务的key值
	String findBizKeyByTaskId(String taskId);

	// 根据任务对象查找绑定业务的key值
	String findBizKeyByTask(Task task);

	// 结束一个任务，包括领取组任务，添加批注信息，结束任务，返回下一个任务
	Task saveSubmitTask(String taskId, String currentuser, String message, Map<String, Object> variables);

	// 根据任务id查找任务
	Task findTaskById(String taskId);

	// 根据流程实例id查找当前正在执行的任务
	Task findTaskByProcessInstId(String processInstid);

	// 根据绑定的业务key值查找当前的任务ID列表(可能并行的，可能会有多个)
	List<String> findCurrentTasksByBizKey(String processDefineKey, String bizkey);

	/** 与批注相关 **/
	// 根据绑定的流程定义ID+业务ID，查询历史批注信息
	List<Comment> findCommentByBizKey(String processkey, String bizkey);

	// 根据绑定的业务ID（不重复时)，查询历史批注信息 */
	List<Comment> findCommentByBizKey(String bizkey);

	// 根据绑定的流程定义ID+业务ID，查询历史批注信息
	List<Comment> findCommentByTaskId(String taskId);

	/** 与人员分配相关 */
	// 根据任务id判断是否组任务
	boolean isGroupUser(String taskId);

	// 根据任务id判断是否组任务
	boolean isGroupUser(Task task);

	// 取消领取任务，将个人任务撤退会组任务
	void User2Group(String taskid, String currentuser);

	// 领取任务，将组任务领取为个人任务
	void Group2User(String taskid, String currentuser);

	// 查询组任务成员历史列表
	List<HistoricIdentityLink> findHisGroupUsers(String taskid);

	// 查看组任务成员列表
	List<IdentityLink> findGroupUsers(String taskid);

}
